]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
popup-menu: Allow adjusting where in the source the arrow points to
authorFlorian Müllner <fmuellner@gnome.org>
Wed, 14 Sep 2011 22:14:03 +0000 (00:14 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Thu, 13 Oct 2011 13:03:32 +0000 (15:03 +0200)
Currently BoxPointer/Menus always point to the center of the
associated source actor. This is generally what we want, but
add some API to adjust that behavior for the cases where it
isn't.

https://bugzilla.gnome.org/show_bug.cgi?id=659274

js/ui/boxpointer.js
js/ui/popupMenu.js

index 4f6a2fb5a6610d525d9d64b5da9113ea51bd57d6..00da8a238a1e8555fd5f16b54b93a1af8c6a7472 100644 (file)
@@ -46,6 +46,7 @@ BoxPointer.prototype = {
         this._yOffset = 0;
         this._xPosition = 0;
         this._yPosition = 0;
+        this._sourceAlignment = 0.5;
     },
 
     show: function(animate, onComplete) {
@@ -180,7 +181,7 @@ BoxPointer.prototype = {
         this.bin.allocate(childBox, flags);
 
         if (this._sourceActor && this._sourceActor.mapped)
-            this._reposition(this._sourceActor, this._alignment);
+            this._reposition(this._sourceActor, this._arrowAlignment);
     },
 
     _drawBorder: function(area) {
@@ -312,18 +313,31 @@ BoxPointer.prototype = {
         this.actor.show();
 
         this._sourceActor = sourceActor;
-        this._alignment = alignment;
+        this._arrowAlignment = alignment;
 
         this._reposition(sourceActor, alignment);
     },
 
+    setSourceAlignment: function(alignment) {
+        this._sourceAlignment = alignment;
+
+        if (!this._sourceActor)
+            return;
+
+        // We need to show it now to force an allocation,
+        // so that we can query the correct size.
+        this.actor.show();
+
+        this._reposition(this._sourceActor, this._arrowAlignment);
+    },
+
     _reposition: function(sourceActor, alignment) {
         // Position correctly relative to the sourceActor
         let sourceNode = sourceActor.get_theme_node();
         let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
         let sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
-        let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) / 2;
-        let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) / 2;
+        let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
+        let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
         let [minWidth, minHeight, natWidth, natHeight] = this.actor.get_preferred_size();
 
         // We also want to keep it onscreen, and separated from the
index d5048a272252cf7e5a04c66015e59960a68d3fe5..2b5a3d9f85eed63a2569d70919e2d4aeca007631 100644 (file)
@@ -1142,10 +1142,10 @@ function PopupMenu() {
 PopupMenu.prototype = {
     __proto__: PopupMenuBase.prototype,
 
-    _init: function(sourceActor, alignment, arrowSide) {
+    _init: function(sourceActor, arrowAlignment, arrowSide) {
         PopupMenuBase.prototype._init.call (this, sourceActor, 'popup-menu-content');
 
-        this._alignment = alignment;
+        this._arrowAlignment = arrowAlignment;
         this._arrowSide = arrowSide;
 
         this._boxPointer = new BoxPointer.BoxPointer(arrowSide,
@@ -1198,13 +1198,17 @@ PopupMenu.prototype = {
         this._boxPointer.setArrowOrigin(origin);
     },
 
+    setSourceAlignment: function(alignment) {
+        this._boxPointer.setSourceAlignment(alignment);
+    },
+
     open: function(animate) {
         if (this.isOpen)
             return;
 
         this.isOpen = true;
 
-        this._boxPointer.setPosition(this.sourceActor, this._alignment);
+        this._boxPointer.setPosition(this.sourceActor, this._arrowAlignment);
         this._boxPointer.show(animate);
 
         this.actor.raise_top();